iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0
Modern Web

『卡夫卡的藏書閣』- 程序猿必須懂的Kafka開發與實作系列 第 17

卡夫卡的藏書閣【Book17】- Kafka - KafkaJS 生產者 - 5

  • 分享至 

  • xImage
  •  

“He is terribly afraid of dying because he hasn’t yet lived.”
― Franz Kafka
456號你還是上飛機吧 這樣對你比較好


重試機制

可選參數 retry 可以同時用在生產者跟消費者,可選參數 retry 是用來設定重試機制的相關參數,重試機制主要是用來重新連線和讓 API 重新呼叫 Kafka 去新增或是取得訊息。

這邊的重試機制很有趣,是使用一個會指數化成長的隨機函式去決定每次重試間隔的時間,下面這個會詳細介紹這個機制和相關參數的作用

  • 第一次重試:
    • 重試時間間格為 initialRetryTime 毫秒,預設為 300 毫秒
  • 第N次重試:
    • 公式為:Random(上一次的重試時間 * (1 - factor), 上一次的重試時間 * (1 + factor)) * multiplier
    • 當第二次重試時
      • 上一次的重試時間會等於 initialRetryTime 也就是 300 毫秒
      • factor 的預設值是0.2、multiplier的預設值是2
      • 帶入公式後,Random(300 * (1 - 0.2), 300 * (1 + 0.2)) * 2,計算後是 Random(240, 360) * 2 也就是說,這一次的間隔會在480毫秒到720毫秒之間
    • 接著,當第三次重試時
      • 上一次的重試時間落在480毫秒到720毫秒之間,將上下限的數值分別帶入公式
        • 480毫秒:Random(480 * (1 - 0.2), 480 * (1 + 0.2)) * 2,計算後是Random(768, 1152)毫秒
        • 720毫秒:Random(720 * (1 - 0.2), 720 * (1 + 0.2)) * 2,計算後是Random(1152, 1728)毫秒
      • 到這邊分別取得了上下限,第三次重試的時間會隨機落在768毫秒到1728毫秒之間
    • 之後依此類推下去

如果達到最大重試次數會噴錯誤: KafkaJSNumberOfRetriesExceeded、並且中斷掉,生產者的部分會單純將錯誤顯示,消費者會根據重試次數去等待一段時間、並重啟服務。

所有的可選選項:

  • maxRetryTime
    • 整個重試流程的總等待時間,單位是毫秒
    • 預設值:30000(毫秒)
  • initialRetryTime
    • 重試等待時間的初始值,會隨著公式隨機改變,單位是毫秒
    • 預設值:300(毫秒)
  • factor
    • 隨機的係數
    • 預設值:0.2
  • multiplier
    • 指數化的係數
    • 預設值:2
  • retries
    • 每一次呼叫的總重試次數
    • 預設值:5(次)
  • restartOnFailure
    • 只有消費者使用、生產者不會使用這個參數,下面會詳細說明
    • 預設值:async () => true

範例:

new Kafka({
  clientId: 'my-app',
  brokers: ['kafka1:9092', 'kafka2:9092'],
  retry: {
    initialRetryTime: 100,
    retries: 8
  }
})

上一篇
卡夫卡的藏書閣【Book16】- Kafka - KafkaJS 生產者 - 4
下一篇
卡夫卡的藏書閣【Book18】- Kafka - KafkaJS 生產者 - 6
系列文
『卡夫卡的藏書閣』- 程序猿必須懂的Kafka開發與實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言